package com.hyy.blogtest.common.utils;

import com.hyy.blogtest.common.exception.UserException;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.UUID;

@Slf4j
public class SecurityUtil {


    /*
    * 对传递过来的密码进行加密，然后返回64长度的加密值
    * 注册功能，在这里获取数据库密码
    * */
    public static String encryptPassword(String password) {
        if (password == null) {
            throw new UserException("密码不能为空");
        }

        //生成盐值
        //uuid是java util类中依据时间戳和mac生成的，格式：550e8400-e29b-41d4-a716-446655440000（32长度）
        String salt = UUID.randomUUID().toString().replace("-", "");

        //加盐 然后再加密
        //getBytes(utf_8)是转换成该编码格式的字节数组
        //根据salt+password 进行加密 得到一个哈希值（32长度）
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        return salt + securityPassword;//返回最终的加密密码，前置是盐值，后者是密码，长度都是32
    }


    /*
     * 验证用户的密码是否正确
     * 数据库存储的是加密后的字符串
     * */
    public static boolean verify(String inputPassword, String sqlPassword) {
        if (!StringUtils.hasLength(inputPassword)
                || !StringUtils.hasLength(sqlPassword)) {
            log.error("用户输入的密码为空，或者数据库中未查找到密码");
            return false;
        }
        if (sqlPassword.length() != 64) {
            log.error("数据库密码不是标准的64长度");
            return false;
        }


        //拿到盐值
        String salt = sqlPassword.substring(0, 32);

        //生成对应用户的加密值
        String password = salt+DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));

        return password.equals(sqlPassword);

    }
}
